﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using JPSOFTWARE.BON.Modelos;
using System.Web.Helpers;
using System.IO;
using JPSOFTWARE.BON.Regra;
using System.Collections;
using JPSoftwareMVC.Filtro;
using Modelos;
using System.Globalization;

namespace JPSoftwareMVC.Areas.GestaoProdutos.Controllers
{    
    public class ProdutosController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        public void CarregarDistribuidoras()
        {
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            if (Session["DadosUsuario"] != null)
            {
                UsuarioModel usuarioModel = Session["DadosUsuario"] as JPSOFTWARE.BON.Modelos.UsuarioModel;
                List<DistribuidoraCombo> distribuidoraCombo = rnDistribuidora.CarregarDistribuidora(usuarioModel.IdUsuario);
                ViewData["DistribuidoraCombo"] = new SelectList(distribuidoraCombo, "IdDistribuidora", "Distribuidora");
            }
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        public void CarregarProdutos()
        {
            RnProdutos rnProdutos = new RnProdutos();
            List<ProdutosView> produto = rnProdutos.ListarTodosProdutos();
            ViewData["ProdutosCombo"] = new SelectList(produto, "IdProduto", "NomeProduto");
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador")]
        public void CarregarProdutosAdministrar()
        {
            RnProdutos rnProdutos = new RnProdutos();
            List<ProdutosView> produto = rnProdutos.ListarTodosProdutosAdministrar();
            ViewData["ProdutosCombo"] = new SelectList(produto, "IdProduto", "NomeProduto");
        }

        public void CarregarSubCategoriaEditarCombo(int IdCategoria)
        {
            RnProdutos rnProdutos = new RnProdutos();
            List<SubCategoria> subCategoria = rnProdutos.ListarSubCategoria(IdCategoria);
            ViewData["SubCategoriaCombo"] = new SelectList(subCategoria, "IdSubCategoria", "NomeSubCategoria");              
        }

        public void CarregarBebidasEditarCombo(int IdSubCategoria)
        {
            RnProdutos rnProdutos = new RnProdutos();
            List<Produto> bebida = rnProdutos.ListarBebidas(IdSubCategoria);
            ViewData["BebidaCombo"] = new SelectList(bebida, "IdBebida", "NomeBebida");  
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador")]
        public JsonResult CarregarSubCategoria(int id)
        {            
            RnProdutos rnProdutos = new RnProdutos();
            List<SubCategoria> subCategoria = rnProdutos.ListarSubCategoria(id);
            return Json(subCategoria, JsonRequestBehavior.AllowGet);
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador")]
        public void CarregarSubCategoriaAdministrar()
        {
            RnProdutos rnProdutos = new RnProdutos();
            List<SubCategoria> subCategoria = rnProdutos.ListarSubCategoria();
            ViewData["SubCategoriaCombo"] = new SelectList(subCategoria, "IdSubCategoria", "NomeSubCategoria");
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador")]
        public void CarregarCategoria()
        {
            RnProdutos rnProdutos = new RnProdutos();
            List<Categoria> categoria = rnProdutos.ListarCategoria();
            ViewData["CategoriaCombo"] = new SelectList(categoria, "IdCategoria", "NomeCategoria"); 
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        public JsonResult CarregarBebidas(int id)
        {
            RnProdutos rnProdutos = new RnProdutos();
            List<Produto> bebida = rnProdutos.ListarBebidas(id);
            return Json(bebida, JsonRequestBehavior.AllowGet);
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        private void CarregarSituacao()
        {
            RnProdutos rnProdutos = new RnProdutos();

            List<Situacao> situacao = new List<Situacao>()
            {
                new Situacao{IdSituacao = true, NomeSituacao="Ativo"},
            new Situacao{IdSituacao = false, NomeSituacao="Inativo"}
            };

            ViewData["Situacao"] = new SelectList(situacao, "IdSituacao", "NomeSituacao");
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        public JsonResult ListarProdutosDistribuidora(int id)
        {
            RnProdutos rnProdutos = new RnProdutos();
            Retorno retorno = new Retorno();
            retorno = rnProdutos.ListarProdutos(id);
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador")]
        public JsonResult ListarProduto(int id)
        {
            RnProdutos rnProdutos = new RnProdutos();
            List<ProdutosView> lista = new List<ProdutosView>();
            lista = rnProdutos.ListarProdutoGerenciar(id);
            return Json(lista, JsonRequestBehavior.AllowGet);
        }

        public ActionResult ListarProdutos()
        {
            CarregarDistribuidoras();
            return View();
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador")]
        [HttpGet]
        public ActionResult GerenciarProdutos()
        {
            CarregarProdutosAdministrar();
            return View();
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        [HttpGet]
        public ActionResult RegistrarProdutos()
        {
            ViewData["ProdutoInserido"] = false;
            CarregarDistribuidoras();
            CarregarProdutos();            
            CarregarSituacao();
            return View();
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        [HttpPost]
        public ActionResult RegistrarProdutos(RegistrarProdutosModel produto)
        {
            Retorno retorno = new Retorno();
            RnProdutos rnProdutos = new RnProdutos();            

            retorno = rnProdutos.RegistrarProdutos(produto);

            retorno.Sucesso = true;

            if (retorno.Sucesso)
            {
                ViewData["ProdutoInserido"] = true;
                ViewData["Mensagem"] = retorno.Mensagem;
            }
            else
            {
                ViewData["ProdutoErro"] = true;
                ViewData["Mensagem"] = retorno.Mensagem;
            }

            CarregarDistribuidoras();
            CarregarProdutos();
            //CarregarFormatoMedida();
            CarregarSituacao();

            return View();
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador")]
        [HttpGet]
        public ActionResult RegistrarProdutosAdministrar()
        {
            ViewData["ProdutoInserido"] = false;
            CarregarCategoria();
            CarregarSubCategoriaAdministrar();
            CarregarSituacao();
            return View();
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador")]
        [HttpPost]
        public ActionResult RegistrarProdutosAdministrar(RegistrarProdutosModel produto)
        {
            RnProdutos rnProdutos = new RnProdutos();
            Retorno retorno = new Retorno();

            try
            {
                if (Session["DadosUsuario"] != null)
                {
                    retorno = rnProdutos.RegistrarProdutosAdministrar(produto);

                    if (retorno.Sucesso)
                    {
                        ViewData["ProdutoInserido"] = true;
                        ViewData["Mensagem"] = retorno.Mensagem;
                    }
                    else
                    {
                        ViewData["ProdutoErro"] = true;
                        ViewData["Mensagem"] = retorno.Mensagem;
                    }
                }

                CarregarCategoria();
                CarregarSubCategoriaAdministrar();
                CarregarSituacao();

                return View();
            }
            catch (Exception)
            {
                
                throw;
            }
            ViewData["ProdutoInserido"] = false;
            CarregarCategoria();
            CarregarSubCategoriaAdministrar();
            CarregarSituacao();
            return View();
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador")]
        [HttpGet]
        public ActionResult EditarProdutoAdministrar(int id)
        {                                 
            CarregarSituacao();
            CarregarCategoria();            

            RnProdutos rnProdutos = new RnProdutos();
            AlterarProdutosModel dado = new AlterarProdutosModel();

            ViewData["ProdutoAlterado"] = false;

            dado = rnProdutos.AlterarProdutoAdministrar(id).Objeto;

            CarregarSubCategoriaEditarCombo(dado.IdCategoria);  
          

            return View(dado);
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador")]
        [HttpPost]
        public ActionResult EditarProdutoAdministrar(AlterarProdutosModel produto)
        {
            RnProdutos rnProdutos = new RnProdutos();
            Retorno retorno = new Retorno();

            try
            {
                if (Session["DadosUsuario"] != null)
                {
                    retorno = rnProdutos.AlterarProdutoAdministrar(produto);

                    if (retorno.Sucesso)
                    {
                        ViewData["ProdutoAlterado"] = true;
                        ViewData["Mensagem"] = retorno.Mensagem;
                    }
                    else
                    {
                        ViewData["ProdutoErro"] = true;
                        ViewData["Mensagem"] = retorno.Mensagem;
                    }
                }

                CarregarCategoria();
                CarregarSubCategoriaEditarCombo(0);                
                CarregarSituacao();

                return View();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        [HttpGet]
        public ActionResult EditarProduto(int IdProduto, int IdDistribuidora)
        {
            CarregarDistribuidoras();
            CarregarProdutos();
            CarregarSituacao();

            RnProdutos rnProdutos = new RnProdutos();
            AlterarProdutosModel dado = new AlterarProdutosModel();

            ViewData["ProdutoAlterado"] = false;

            dado = rnProdutos.AlterarProduto(IdProduto, IdDistribuidora).Objeto;

            return View(dado);
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        [HttpPost]
        public ActionResult EditarProduto(AlterarProdutosModel produto)
        {
            RnProdutos rnProdutos = new RnProdutos();
            Retorno retorno = new Retorno();            

            try
            {
                if (Session["DadosUsuario"] != null)
                {
                    retorno = rnProdutos.AlterarProduto(produto);

                    if (retorno.Sucesso)
                    {
                        ViewData["ProdutoAlterado"] = true;
                        ViewData["Mensagem"] = retorno.Mensagem;
                    }
                    else
                    {
                        ViewData["ProdutoErro"] = true;
                        ViewData["Mensagem"] = retorno.Mensagem;
                    }                    
                }

                CarregarDistribuidoras();
                CarregarProdutos();
                CarregarSubCategoriaEditarCombo(0);
                CarregarBebidasEditarCombo(0);                
                CarregarSituacao();

                return View();                
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }
        
        public ActionResult VisualizarProduto(int id)
        {
            RnProdutos rnProdutos = new RnProdutos();
            Retorno retorno = new Retorno();

            ProdutosView produto = rnProdutos.ListarProduto(id);

            return View(produto);
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        [HttpGet]
        public JsonResult ExibirExcluirProduto(int id)
        {
            RnProdutos rnProdutos = new RnProdutos();
            ProdutosView produtosView = new ProdutosView();

            ViewData["IdProduto"] = id;

            produtosView = rnProdutos.ExibirExcluirProduto(id);

            return Json(produtosView, JsonRequestBehavior.AllowGet);
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        public JsonResult ExcluirProduto(int id)
        {
            Retorno retorno = new Retorno();
            RnProdutos rnProdutos = new RnProdutos();
            retorno = rnProdutos.ExcluirProduto(id);
            retorno.Sucesso = true;
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
    }
}